package main//入口包，所有go项目必须指定main

import (
    "flag" //命令行参数解析
    "github.com/zeromicro/go-zero/core/conf" //go-zero配置加载
    "github.com/zeromicro/go-zero/rest" //go-zero HTTP服务器
    "net/http" //标准HTTP协议包
    "github.com/zeromicro/go-zero/rest/httpx" //go-zero工具包，响应json数据
    "log" //日志处理
    
    "hello/controller" // 自己的控制器
)

type Config struct { //定义配置结构体，对应配置文件字段
    Name string
    Host string `json:",default=0.0.0.0"`
    Port int
}

var f = flag.String("f", "helloworld.yaml", "config file") //命令行明确配置文件路径

func main() {
    flag.Parse() //解析命令行参数
    var c Config
    conf.MustLoad(*f, &c) //加载配置到结构体

    restConf := rest.RestConf{
        Host: c.Host, //服务地址
        Port: c.Port, //服务端口
    }

    srv, err := rest.NewServer(restConf) //创建HTTP服务器
    if err != nil {
        log.Fatal(err) //创建失败终止程序
        return
    }

    srv.AddRoute(rest.Route{
        Method: http.MethodGet, //GET方法
        Path:   "/hello1", //路由路径
        Handler: func(w http.ResponseWriter, r *http.Request) { //路由处理函数
            httpx.OkJson(w, map[string]string{"message": "Hello World 1111!"}) //返回json响应
        },
    })
    
    srv.AddRoute(rest.Route{
        Method: http.MethodGet,
        Path:   "/hello2",
        Handler: controller.HelloWorldHandler, //复用分包handler
    })

    defer srv.Stop() //程序退出时优雅停止服务
    srv.Start() //启动HTTP服务
}